package com.bjpowernode.mq;


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bjpowernode.canal.CanalData;
import com.bjpowernode.entity.PmsProduct;
import com.bjpowernode.service.SearchService;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

// 监听商品服务发送的消息，当对MySql数据库进行增删改操作时，canal监听到其操作日志，canal将消息发送消息到MQ，MQ接收到消息后，通知搜索服务模块进行索引更新从而消费消息。
@Component
public class ProductListener {

    @Resource
    SearchService searchService;
    //添加注解监听指定队列，进行消息消费
    @RabbitListener(queues = "productqueue")
    public void listenProduct(Message msg) throws Exception {
        //消息体，并将消息体传为String类型字符串
        String body = new String(msg.getBody());
        /*该函数将JSON格式的字符串body解析为CanalData对象。使用了JSONObject.parseObject()方法，该方法将指定的JSON字符串反序列化为Java对象。在此处，将body解析为CanalData类型，即将JSON数据映射为Java对象的属性*/
        CanalData canalData = JSONObject.parseObject(body, CanalData.class);

        //商品上下架的监听消息功能实现
        //如果是更新数据的操作才能有下一步操作
        if ("UPDATE".equals(canalData.getType())){
            //取得老数据（老数据中只有更新的字段）
            List<String> olds = canalData.getOld();
            //取得新数据（新数据中是所有的字段）
            List<String> datas = canalData.getData();
            //遍历老数据，同时取得老数据和新数据（并将数据转换为对应对象的属性数据）
            for (int i = 0; i < olds.size(); i++){
                PmsProduct old = JSONObject.parseObject(olds.get(i), PmsProduct.class);
                PmsProduct pmsProduct = JSONObject.parseObject(datas.get(i), PmsProduct.class);

                //判断监听到的数据库操作日志的消息是否是上下架的操作（判断条件是老数据中的字段是否有上下架字段）
                //null != old.getIsPublish()【如果为ture则为上下架操作】pmsProduct.getIsPublish()【同时为ture则为上架操作】
                if (null != old.getIsPublish() && pmsProduct.getIsPublish()){
                    //处理相册（只需要向用户展示相册中第一张图片）
                    JSONArray objects = JSONObject.parseArray(pmsProduct.getAlbum());
                    String album = objects.getString(0);
                    //上架操作 需要同步在es中新增一条数据记录
                    searchService.add(pmsProduct.getId(),pmsProduct.getName(),pmsProduct.getPrice(),album);

                }
                //下架操作[!pmsProduct.getIsPublish()]为ture则删除
                if (null != old.getIsPublish() && !pmsProduct.getIsPublish()){
                    //下架操作 需要同步在es中删除一条数据记录
                    searchService.del(pmsProduct.getId());
                }
            }
        }
    }
}
